home *** CD-ROM | disk | FTP | other *** search
- /* ======================
- * AEAAppleEventSender.cc
- * ======================
- */
-
- #include "AEADebugging.h"
-
- #include <string.h>
-
- #include <AEBuild.h>
-
- #include "DGHandleLocker.hh"
-
- #include "AEAAppleEvent.hh"
- #include "AEAAppleEventSender.hh"
-
- AEAAppleEventSender::AEAAppleEventSender(AEEventClass inEventClass, AEEventID inEventID)
- : mEventClass(inEventClass), mEventID(inEventID), mAEIdleUPP(NULL)
- , mAddress(gNullDesc), mGizmoBuildString(NULL), mAppleEvent(gNullDesc)
- {
-
- }
-
- AEAAppleEventSender::AEAAppleEventSender(AEEventClass inEventClass, AEEventID inEventID, AEIdleUPP &inAEIdleUPP)
- : mEventClass(inEventClass), mEventID(inEventID), mAEIdleUPP(inAEIdleUPP)
- , mAddress(gNullDesc), mGizmoBuildString(NULL), mAppleEvent(gNullDesc)
- {
-
- }
-
- AEAAppleEventSender::~AEAAppleEventSender()
- {
- OSErr err;
-
- if (mGizmoBuildString)
- delete mGizmoBuildString;
-
- err = ::AEDisposeDesc(&mAddress);
- err = ::AEDisposeDesc(&mAppleEvent);
- }
-
- void
- AEAAppleEventSender::SetAddress(const ProcessSerialNumber &inPSN)
- {
- OSErr err;
-
- err = ::AEDisposeDesc(&mAddress);
- err = ::AECreateDesc(typeProcessSerialNumber, &inPSN, sizeof inPSN, &mAddress);
- ThrowIfOSErr_(err);
- }
-
- void
- AEAAppleEventSender::SetAddress(const OSType inSignature)
- {
- OSErr err;
-
- err = ::AEDisposeDesc(&mAddress);
- err = ::AECreateDesc(typeApplSignature, &inSignature, sizeof inSignature, &mAddress);
- ThrowIfOSErr_(err);
- }
-
- void
- AEAAppleEventSender::SetAddress(const TargetID &inTargetID)
- {
- OSErr err;
-
- err = ::AEDisposeDesc(&mAddress);
- err = ::AECreateDesc(typeTargetID, &inTargetID, sizeof inTargetID, &mAddress);
- ThrowIfOSErr_(err);
- }
-
- void
- AEAAppleEventSender::SetGizmoBuildString(const char *inString)
- {
- if (inString == NULL) throw paramErr;
-
- if (mGizmoBuildString != NULL)
- if (strcmp(mGizmoBuildString, inString) == 0)
- return;
- else {
- delete mGizmoBuildString;
- ::AEDisposeDesc(&mAppleEvent);
- }
- mGizmoBuildString = new char [strlen(inString) + 1];
- strcpy(mGizmoBuildString, inString);
- }
-
- void
- AEAAppleEventSender::Build()
- {
- OSErr err;
-
- if (mAddress.descriptorType == typeNull)
- throw errAEUnknownAddressType;
-
- if (mGizmoBuildString == NULL)
- SetGizmoBuildString("");
-
- err = ::AEDisposeDesc(&mAppleEvent);
- ThrowIfOSErr_(err);
-
- //::HLock(mAddress.dataHandle); // Change this to something scalable
- DGHandleLocker lock(mAddress.dataHandle);
- err = ::AEBuildAppleEvent(mEventClass, mEventID,
- mAddress.descriptorType, *mAddress.dataHandle, GetHandleSize(mAddress.dataHandle),
- kAutoGenerateReturnID, kAnyTransactionID, &mAppleEvent, mGizmoBuildString);
- //::HUnlock(mAddress.dataHandle);
- ThrowIfOSErr_(err);
- }
-
- void
- AEAAppleEventSender::Send()
- {
- OSErr err;
-
- if (mAppleEvent.descriptorType == typeNull)
- Build();
-
- AEAAppleEvent evt(mAppleEvent);
- evt.Send(kAENoReply, mAEIdleUPP);
- }
-
- void
- AEAAppleEventSender::SendAndWaitForReply(AppleEvent &outReply)
- {
- OSErr err;
-
- if (mAppleEvent.descriptorType == typeNull)
- Build();
-
- AEAAppleEvent evt(mAppleEvent);
- evt.Send(kAEWaitReply, mAEIdleUPP);
- evt.GetReply(outReply);
- }
-
- void
- AEAAppleEventSender::SendAndWaitForReply(AEADescAppleEvent &outReply)
- {
- OSErr err;
-
- if (mAppleEvent.descriptorType == typeNull)
- Build();
-
- AEAAppleEvent evt(mAppleEvent);
- evt.Send(kAEWaitReply, mAEIdleUPP);
- evt.GetReply(outReply);
- }
-
-